package cn.android.support.v7.lib.sin.crown.base;

import android.app.Activity;
import android.content.ContentResolver;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.design.widget.Snackbar;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;


import com.androidadvance.topsnackbar.TSnackbar;

import java.lang.reflect.Field;

import cn.android.support.v7.lib.sin.crown.R;
import cn.android.support.v7.lib.sin.crown.popu.TopSnackbar;
import cn.android.support.v7.lib.sin.crown.utils.ProportionUtils;

/**
 * Created by  彭治铭 on 2017/9/10.
 */
public abstract class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 将当前Activity添加到栈中
        BaseActivityManager.getInstance().pushActivity(this);
        requestWindowFeature(Window.FEATURE_NO_TITLE);//无标题栏(setContentView()之前才有效)
        if (Build.VERSION.SDK_INT < 19) {//4.4
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏,有效。因为4.4以下状态栏透明设置无效，奇丑无比，所以设置全屏。
        }
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        if (Build.VERSION.SDK_INT >= 21) {
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//状态栏背景透明(和应用背景一样4.4及以上才有效,测试真机，亲测有效)

        //设置状态栏背景透明【亲测有效】
        try {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);   //去除半透明状态栏
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);  //一般配合fitsSystemWindows()使用, 或者在根部局加上属性android:fitsSystemWindows="true", 使根部局全屏显示
            if (Build.VERSION.SDK_INT >= 21) {
                getWindow().setStatusBarColor(Color.TRANSPARENT);
            }
            ViewPager.DecorView decordView = (ViewPager.DecorView) getWindow().getDecorView();     //获取DecorView实例
            Field field = ViewPager.DecorView.class.getDeclaredField("mSemiTransparentStatusBarColor");  //获取特定的成员变量
            field.setAccessible(true);   //设置对此属性的可访问性
            field.setInt(decordView, Color.TRANSPARENT);  //修改属性值
        } catch (Exception e) {
            //Log.e("test", "状态栏异常:\t" + e.getMessage());
        }

        //getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//底部菜单栏透明【虚拟键】
        //友盟
        //设置输出运行时日志
        //UMGameAgent.setDebugMode(true);
        //UMGameAgent.init(this);
        //fixme 这个设置了，部分手机屏幕可能会花屏。建议不用。如果用了，花屏解决方案：给activity最外层布局加上背景颜色即可。F
        //getWindow().setBackgroundDrawable(null);//减少Activity背景内存

        //Log.e("test", "当前屏幕亮度:\t" + getScreenBrightness(this));
        //设置屏幕的亮度【统一整个App应用的的亮度】
        //setScreenBrightness(this, getScreenBrightness(this));//默认亮度就不用设置了
    }

    //设置状态栏的背景颜色，亲测对5.0及以上有效。
    protected void setStatusBarColor(int color) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //5.0以上使用原生方法
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            getWindow().setStatusBarColor(color);//设置状态栏颜色。可直接设置颜色 Color.parseColor("#30343F")
        }
    }

    //获取当前屏幕亮度【默认亮度】
    public static int getScreenBrightness(Activity activity) {
        int nowBrightnessValue = 0;
        ContentResolver resolver = activity.getContentResolver();
        try {
            nowBrightnessValue = android.provider.Settings.System.getInt(
                    resolver, Settings.System.SCREEN_BRIGHTNESS);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return nowBrightnessValue;
    }

    //设置屏幕亮度[只对当前应用有效。无法更改系统的。在模拟器上无效。但是在真机上有效。亲测有效。]
    //范围是0-255
    public static void setScreenBrightness(Activity activity, int brightness) {
        // Settings.System.putInt(activity.getContentResolver(),
        // Settings.System.SCREEN_BRIGHTNESS_MODE,
        // Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
        WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
        lp.screenBrightness = Float.valueOf(brightness) * (1f / 255f);
        activity.getWindow().setAttributes(lp);
    }

    @Override
    protected void onStart() {
        super.onStart();
        initUI();
        adapterUI();
        if (isAutoAdapterUI()) {
            try {
                //自动适配所有控件大小。
                ProportionUtils.getInstance().adapterAllView(this, getParentView(), true, true);
            } catch (Exception e) {
                Log.e("test", "自动适配所有控件异常:\t" + e.getMessage());
            }

        }
    }

    protected void onResume() {
        super.onResume();
        //UMGameAgent.onResume(this);
        //设置状态栏字体颜色
        BaseApplication.getInstance().setStatusBarDrak(getWindow(), isDarkMode());
        if (isopenAnim()) {
            //启动动画(app首次启动也有效果。)
            overridePendingTransition(R.anim.crown_right_in_without_alpha, R.anim.crown_right_out_without_alpha);
            //overridePendingTransition(0, 0);这个可以关闭动画，系统默认动画也会关闭
        } else {
            overridePendingTransition(0, 0);//关闭动画。防止动画没有关闭。
        }
    }

    protected void onPause() {
        super.onPause();
        if (isopenAnim()) {
            //退出动画(app最后一个activity,关闭应用时，无效。即退出应用时无效)
            overridePendingTransition(R.anim.crown_right_in_without_alpha, R.anim.crown_right_out_without_alpha);
        } else {
            overridePendingTransition(0, 0);
        }
        //UMGameAgent.onPause(this);
    }

    //一般onAttachedToWindow()可以进行一些超时的操作。执行onAttachedToWindow()方法时，界面基本都已经加载完成。
    // onResume()执行完成之后才会显示出界面。所以onResume()之前的方法不行执行超时的方法。
    //每次界面加载到当前窗口的时候，就会调用。（activity消失，再显示出来的时候，也会调用。）
    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (!isListener) {
            isListener = true;
            listener();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        BaseActivityManager.getInstance().finishActivity(this);//移除当前activity
    }

    //判断事件是否已经执行，防止重复执行。
    private boolean isListener = false;

    //是否开启动画。true开启(默认开启)，false不开启。[子类可以重写]
    protected boolean isopenAnim() {
        return true;
    }

    //初始化UI
    protected abstract void initUI();//UI布局在onResume()中被调用

    //事件和数据逻辑处理(可以执行一些耗时的操作)
    //事件在onAttachedToWindow()中被调用(只会调用一次)。等待UI布局加载完成之后再执行。
    protected abstract void listener();

    public Activity getActivity() {
        return this;
    }

    //屏幕适配【如果自动适配了，这个方法也就没有多大意义了，不过adapterUI()和isAutoAdapterUI()两个方法都会执行。】
    protected void adapterUI() {
    }

    //是否自动适配所有控件大小，默认是为fasle
    protected boolean isAutoAdapterUI() {
        return false;
    }

    //退出程序时调用,即点两次退出应用时执行。即isExit()返回true时有效。
    protected void onfinish() {
    }

    //true 程序按两次退出。false正常按键操作。
    protected boolean isExit() {
        return false;
    }

    //true 状态栏字体颜色为 黑色，false 状态栏字体颜色为白色。
    protected boolean isDarkMode() {
        return BaseApplication.getInstance().darkmode;
    }

    //获取xml文件最外层控件。
    public ViewGroup getParentView() {
        View decorView = getWindow().getDecorView();//布局里面的最顶层控件，本质上是FrameLayout(帧布局)，FrameLayout.LayoutParams
        ViewGroup contentView = (ViewGroup) decorView.findViewById(android.R.id.content);//我们的布局文件。就放在contentView里面。contentView本质上也是FrameLayout(帧布局)，FrameLayout.LayoutParams
        View parent = contentView.getChildAt(0);//这就是我们xml布局文件最外层的那个父容器控件。
        return (ViewGroup) parent;
    }


    public View getContent() {
        return getWindow().getDecorView().findViewById(android.R.id.content);
    }

    public View getContent(View view) {
        if (view != null) {
            return view;
        } else {
            return this.getContent();
        }
    }

    public void SnackbarMake(String info, boolean top, View view) {
        SnackbarMake(info, top, view, null);
    }

    /**
     * TSnackbar 或 Snackbar 每次调用都是重新实例化出来的。
     *
     * @param info            消息
     * @param top             true 顶部，false正常底部
     * @param view            容器，可以为空。【Snackbar的宽度，就等价于view的宽度，所以传入的view的宽度最好是全屏的。】
     * @param onClickListener 整个控件的点击事件。可以为空
     */
    public void SnackbarMake(String info, boolean top, View view, View.OnClickListener onClickListener) {
        View contentView = this.getContent(view);
        if (top) {
            //TSnackbar用法和Snackbar一样，包括R.id.snackbar_text,R.id.snackbar_action都是一样的。就是方向不同。
            TSnackbar tSnackbar = TSnackbar.make(contentView, info, TSnackbar.LENGTH_SHORT);
            View tSnackView = tSnackbar.getView();
            //防止无法对齐父容器长度
            tSnackView.getLayoutParams().width = contentView.getWidth() > contentView.getLayoutParams().width ? contentView.getWidth() : contentView.getLayoutParams().width;
            tSnackView.requestLayout();
            tSnackView.setPadding(0, ProportionUtils.getInstance().adapterInt(15), 0, 0);//內補丁，會影响TSnackbar的高度哦。补丁越大，高度越高。
            tSnackbar.getView().setBackgroundResource(R.drawable.crown_drawable_snackbar);
            TextView snackbarText = (TextView) tSnackView.findViewById(R.id.snackbar_text);
            snackbarText.setTextColor(Color.WHITE);//设置通知文本的颜色
            snackbarText.setTextSize(20);
            snackbarText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
            snackbarText.setGravity(Gravity.CENTER);
            tSnackbar.show();//TSnackbar每次都必须重新实例化才能显示出来。
            if (onClickListener != null) {
                tSnackbar.getView().setOnClickListener(onClickListener);
            }
        } else {
            //底部【Snackbar不需要每次都实例化，只要实例化一次即可，当为了安全性，建议每次都实例化】
            Snackbar snackbar = Snackbar.make(contentView, info, Snackbar.LENGTH_SHORT);
            View snackView = snackbar.getView();
            snackView.getLayoutParams().width = contentView.getWidth() > contentView.getLayoutParams().width ? contentView.getWidth() : contentView.getLayoutParams().width;
            snackView.requestLayout();
            TextView snackbarText = (TextView) snackView.findViewById(R.id.snackbar_text);
            snackbarText.setTextColor(Color.parseColor("#8080C0"));//设置通知文本的颜色
            snackbarText.setTextSize(17);
            //TextView snackbar_action = (TextView) snackView.findViewById(R.id.snackbar_action);
            //snackbar_action.setTextColor(Color.parseColor("#16A085"));//点击文本的颜色
            //snackbar_action.setTextSize(17);
            snackbarText.setText(info);
            snackbar.show();
            if (onClickListener != null) {
                snackbar.getView().setOnClickListener(onClickListener);
            }
        }

    }


    /**
     * 原生，底部Snackbar
     *
     * @param info            通知文本
     * @param action          点击文本
     * @param onClickListener 点击事件
     */
    public void SnackbarMake(String info, String action, View.OnClickListener onClickListener) {
        //底部【Snackbar不需要每次都实例化，只要实例化一次即可，当为了安全性，建议每次都实例化】
        View contentView = getContent();
        Snackbar snackbar = Snackbar.make(contentView, info, Snackbar.LENGTH_SHORT).setAction(action, onClickListener);
        View snackView = snackbar.getView();
        snackView.getLayoutParams().width = contentView.getWidth() > contentView.getLayoutParams().width ? contentView.getWidth() : contentView.getLayoutParams().width;
        snackView.requestLayout();
        TextView snackbarText = (TextView) snackView.findViewById(R.id.snackbar_text);
        snackbarText.setTextColor(Color.parseColor("#8080C0"));//设置通知文本的颜色
        //snackbarText.setTextSize(17);
        TextView snackbar_action = (TextView) snackView.findViewById(R.id.snackbar_action);
        snackbar_action.setTextColor(Color.parseColor("#16A085"));//点击文本的颜色
        //snackbar_action.setTextSize(17);
        snackbar.show();
    }

    private long exitTime = 0;

    //子类重写以下方法，并且屏蔽//super.onKeyDown(keyCode, event);则，以下方法即可无效。
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (isExit()) {
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
                if ((System.currentTimeMillis() - exitTime) > 2000) {
                    this.SnackbarMake("再按一次退出", true, (View) null);
                    //TopSnackbar.getInstance(this).showTop("再按一次退出");
                    //UtilToast.showToastView("再按一次退出");
                    exitTime = System.currentTimeMillis();
                } else {
                    onfinish();//该方法执行完成之后，才会关闭程序。
                    BaseApplication.getInstance().exit();
                }
                System.gc();
                return true;
            }
        }
        System.gc();//每次按键都调用一次垃圾回收。
        return super.onKeyDown(keyCode, event);
    }
}
